/** IMPORTANT
 * Ez legacy kód, nem kell használni.
 */
package Application;

import Application.Elements.*;
import java.util.LinkedList;
/**
 * A szkeleton program egeszet megvalosito osztaly, a konzolon megkerdezi
 * melyik tesztesetet futtassa, majd meghivja a tesztekert felelos metodusait.
 * Ezek peldanyositjak a modell megfelelo elemeit (hard kodolva), majd futtatja,
 * igy a tesztelo a kimenetbol meg tudja allapitani, hogy helyesen mukodik-e a
 * modell.
 * @author Stikmann
 */
public class SkeletonController {

    /**
     * Egyes teszt eset, ahol egyszerre tobb aramkori elemet is tesztelunk.
     *
     * Itt lefut az osszes sima aramkori elem mukodesenek a tesztje (wavegen
     * nem).
     * A teszt letrehozza a tesztelni kivant kapukat, majd osszekapcsolja azokat
     * egy halozatba. A <i>check()</i> metodoust lefuttatva a halozat osszekote-
     * senek helyessege ellenorzodik. Ezutan a <i>reset()</i> metodus meghiva-
     * saval a halozat alaphelyzetbe all. A felhasznalotol bekert ertek alapjan
     * (ami a gomb allapotanak beallitsa) a halozat kiertekelodik es megjelnik
     * az ervenyes kimenet vagy a halozat hibat jelez.
     */
    public void test1() {
        Network net = new Network();
        AND and = new AND();
        BTN btn = new BTN(false);
        GND gnd = new GND();
        LED led = new LED();
        NOT not = new NOT();
        OR or = new OR();
        VCC vcc = new VCC();

        net.addGate(and);
        net.addGate(btn);
        net.addGate(gnd);
        net.addGate(led);
        net.addGate(not);
        net.addGate(or);
        net.addGate(vcc);

        net.connectGate(btn, or);
        net.connectGate(gnd, or);
        net.connectGate(or, not);
        net.connectGate(not, and);
        net.connectGate(vcc, and);
        net.connectGate(and, led);

        net.check();
        net.reset();
        btn.setErtek(SkeletonHelper.kerdez10("Gomb1 erteke: "));
        try {
            net.simulate();
            System.out.println("A led kimenete: " + led.getOut());
        }
        catch (Exception e) {
            System.out.println("Hiba: "+e);
        }
    }

    /**
     * Tesz eset instabil kapcsolas hibajelzesenek ellenorzesere
     *
     * A felepitett halozat instabil, ha BTN=1. Ekkor hibat jelzunk ki.
     */
    public void test2() {
        Network net = new Network();
        BTN btn1 = new BTN(false);
        AND and1 = new AND();
        NOT not1 = new NOT();
        LED led1 = new LED();

        net.addGate(btn1);

        net.addGate(and1);
        net.addGate(not1);

        net.addGate(led1);

        net.connectGate(btn1, and1);

        net.connectGate(and1, not1);

        net.connectGate(not1, and1);

        net.connectGate(not1, led1);

        String hiba = net.check();
        if (hiba != null) {
            System.out.println(hiba);
        } else {
            net.reset();
            btn1.setErtek(SkeletonHelper.kerdez10("Gomb1 erteke: "));
            try {
                net.simulate();
                System.out.println("A led1 kimenete: " + led1.getOut());
            }
            catch (Exception e) {
                System.out.println("Hiba: "+e);
            }
        }
    }

    /**
     * Teszteset a jelgenerator tesztelesere.
     */
    public void test3() {
        Network net = new Network();
        LinkedList jel=new LinkedList<Boolean>();
        jel.add(false);
        jel.add(true);
        jel.add(false);
        jel.add(true);
        jel.add(true);
        Wavegen wav = new Wavegen(jel);
        LED led = new LED();

        net.addGate(wav);
        net.addGate(led);

        net.connectGate(wav, led);

        net.check();
        net.reset();
        do {
            if (SkeletonHelper.kerdez("Jelgeneratort reseteljem?")) {
                wav.reset();
            }
            if (SkeletonHelper.kerdez("Jelgeneratort leptessem?")) {
                wav.step();
            }
            try {
                net.simulate();
                System.out.println("A led kimenete: " + led.getOut());
            }
            catch (Exception e) {
                System.out.println("Hiba: "+e);
            }
        } while (SkeletonHelper.kerdez("Tesztet folytatassam? "));
    }

    /**
     * Teszteset egy hibas kapcsolasra.
     */
    public void test4() {
        Network net = new Network();
        String hiba;
        GND gnd = new GND();
        AND and = new AND();
        net.addGate(gnd);
        net.addGate(and);
        net.connectGate(gnd, and);
        hiba = net.check();
        if (hiba != null) {
            System.out.println(hiba);
        }
    }

    private CompositeElement makeXor(){
        CompositeElement xor_prototype=new CompositeElement(2,1);
        OR vagy = new OR();
        AND es1=new AND();
        AND es2=new AND();
        NOT nem=new NOT();

        xor_prototype.addGate(vagy);
        xor_prototype.addGate(es1);
        xor_prototype.addGate(es2);
        xor_prototype.addGate(nem);

        xor_prototype.connectGate(es1, nem);
        xor_prototype.connectGate(nem, es2);
        xor_prototype.connectGate(vagy, es2);

        xor_prototype.connectInput(0,vagy);
        xor_prototype.connectInput(1,vagy);
        xor_prototype.connectInput(0,es1);
        xor_prototype.connectInput(1,es1);
        xor_prototype.connectOutput(0,es2);
        return xor_prototype;
    }
    /**
     * Teszteset a kompozit elemre.
     */
    public void test5() {
        Network net = new Network();

        CompositeElement xor1=makeXor();
        CompositeElement xor2=makeXor();
        BTN btn1=new BTN(false);
        BTN btn2=new BTN(false);
        BTN btn3=new BTN(false);
        LED led=new LED();

        net.addGate(xor1);
        net.addGate(xor2);
        net.addGate(btn1);
        net.addGate(btn2);
        net.addGate(btn3);
        net.addGate(led);

        net.connectGate(btn1, xor1.getInput(0));
        net.connectGate(btn1, xor1.getInput(1));
        net.connectGate(xor1.getOutput(0), xor2.getInput(0));
        net.connectGate(btn1, xor1.getInput(1));
        net.connectGate(xor2.getOutput(0), led);

        String hiba = net.check();
        if (hiba != null) {
            System.out.println(hiba);
        } else {
            net.reset();
            btn1.setErtek(SkeletonHelper.kerdez10("Gomb1 erteke: "));
            btn1.setErtek(SkeletonHelper.kerdez10("Gomb2 erteke: "));
            btn1.setErtek(SkeletonHelper.kerdez10("Gomb3 erteke: "));
            try {
                net.simulate();
                System.out.println("A led kimenete: " + led.getOut());
            }
            catch (Exception e) {
                System.out.println("Hiba: "+e);
            }
        }
    }

    public void run() {
        if (SkeletonHelper.kerdez("Teszt 1 (sok sok elem) futtatasa? ")) {
            test1();
        }
        if (SkeletonHelper.kerdez("Teszt 2 (Instabil kapcsolas) futtatasa? ")) {
            test2();
        }
        if (SkeletonHelper.kerdez("Teszt 3 (Wavegen teszt) futtatasa? ")) {
            test3();
        }
        if (SkeletonHelper.kerdez("Teszt 4 (Hibas kapcsolas) futtatasa? ")) {
            test4();
        }
        if (SkeletonHelper.kerdez("Teszt 5 (Kompozit elem) futtatasa? ")) {
            test5();
        }
    }
}
